package com.base.monitor.framework.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.base.monitor.framework.result.Result;
import com.base.monitor.model.model.biz.cfg.vo.IndicatorDeviceGatewayVo;
import org.springframework.core.io.Resource;

import java.io.File;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;

public class JsonUtils {
    /**
     * 读取json文件
     * @param data json文件
     */
    private static String getData(Resource data) {
        try {
            File file = data.getFile();
            long t0 = System.nanoTime();
            String jsonData = jsonRead(file);
            long t1 = System.nanoTime();
            long millis = TimeUnit.NANOSECONDS.toMillis(t1-t0);
            System.out.println(millis +"ms");
            return jsonData;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 从result结果中获取列表数据
     * @param data result内容对应的json文件
     * @param clazz 需要解析的类的Class对象
     * @param <T> 需要解析的类的泛型
     * @return
     */
    public static <T> List<T> getListDataFromResultJson(Resource data,  Class<T> clazz) {
        String jsonStr = JsonUtils.getData(data);
        Result result = JSONObject.parseObject(jsonStr, Result.class);

        if (result == null) {
            return new ArrayList<>();
        }
        JSONArray vo = (JSONArray) result.getData();
        return JSONArray.parseArray(vo.toJSONString(), clazz);
    }

    /**
     * 从result结果中获取实体数据
     * @param data result内容对应的json文件
     * @param clazz 需要解析的类的Class对象
     * @param <T> 需要解析的类的泛型
     * @return
     */
    public static <T> T getObjectDataFromResultJson(Resource data,  Class<T> clazz) {
        String jsonStr = JsonUtils.getData(data);
        Result result = JSONObject.parseObject(jsonStr, Result.class);

        if (result == null) {
            return null;
        }
        JSONObject vo = (JSONObject) result.getData();
        return JSONObject.parseObject(vo.toJSONString(), clazz);
    }

    /**
     * 从json文件中获取列表数据
     * @param data json文件
     * @param clazz 需要解析的类的Class对象
     * @param <T> 需要解析的类的泛型
     * @return
     */
    public static <T> List<T> getListDataFromJson(Resource data,  Class<T> clazz) {
        String jsonStr = JsonUtils.getData(data);
        return JSONArray.parseArray(jsonStr, clazz);
    }

    /**
     * 从json文件中获取实体数据
     * @param data json文件
     * @param clazz 需要解析的类的Class对象
     * @param <T> 需要解析的类的泛型
     * @return
     */
    public static <T> T getObjectDataFromJson(Resource data,  Class<T> clazz) {
        String jsonStr = JsonUtils.getData(data);
        return JSONObject.parseObject(jsonStr, clazz);
    }

    /**
     * 读取文件类容为字符串
     * @param file
     * @return
     */
    private static String jsonRead(File file){
        Scanner scanner = null;
        StringBuilder buffer = new StringBuilder();
        try {
            scanner = new Scanner(file, "utf-8");
            while (scanner.hasNextLine()) {
                buffer.append(scanner.nextLine());
            }
        } catch (Exception e) {

        } finally {
            if (scanner != null) {
                scanner.close();
            }
        }
        return buffer.toString();
    }
}
